package org.aerie.forest.core.frame.rebar.entity;

import java.util.Optional;

import org.aerie.forest.core.brick.exception.ExceptionPack;
import org.aerie.forest.core.genericity.ContainsGenericity;

/**
 * @description forest架构元素合法性校验块
 *
 * @author quark
 * @organization aerie
 * @date 2020年2月20日 下午4:50:08
 * @version 1.2.0
 */
public abstract class AbstractForestValidityCheck<T extends AbstractForestRebar> implements ContainsGenericity<T> {

	/**
	 * @description forest架构元素合法性校验名称
	 * 
	 * @author quark
	 * @date 2020-8-21 21:53:35
	 * @version 2.0.1
	 */
	private final String validityCheckName;

	/**
	 * @description 合法性校验【此校验在AbstractForestRebar创建完成后，子类创建完成前，里面校验失败一定要抛运行时异常】
	 * @param forestRebar 进行校验的forest架构元素
	 * @throws Exception 校验异常
	 *
	 * @author quark
	 * @date 2020年5月12日 下午12:43:23
	 * @version 1.2.0
	 */
	public void isLegal(AbstractForestRebar forestRebar) throws Exception {
		try {
			beginCheck(forestRebar);
		} catch (Exception e) {
			throw new ExceptionPack(validityCheckName + ":校验块结果 -> 校验失败", e);
		}
	}

	/**
	 * @description 开始校验
	 * @throws Exception 校验异常
	 *
	 * @author quark
	 * @date 2020-8-21 22:06:02
	 * @version 2.0.1
	 */
	protected abstract void beginCheck(AbstractForestRebar forestRebar) throws Exception;

	/**
	 * Construction
	 * 
	 * @param validityCheckName forest架构元素合法性校验名称
	 *
	 * @author quark
	 * @date 2020-8-21 21:56:48
	 * @version 2.0.1
	 */
	public AbstractForestValidityCheck(String validityCheckName) {
		super();
		this.validityCheckName = Optional.ofNullable(validityCheckName).filter(p1 -> p1.trim().isEmpty())
				.orElse("未知合法性校验块");
	}

	/**
	 * @description 获得forest架构元素合法性校验名称
	 * @return forest架构元素合法性校验名称
	 *
	 * @author quark
	 * @date 2020-8-21 21:57:05
	 * @version 2.0.1
	 */
	public String getValidityCheckName() {
		return validityCheckName;
	}

}
